前幾天在SQL下了一句簡單的查詢:
SELECT * FROM USER WHERE NAME = 'Vivi'
出來的結果竟然是
Id | Name |
---|---|
1 | Vivi |
2 | vivi |
沒有區分大小寫!!
查了一下原來是定序的問題,以前用資料庫都是得過且過,完全不知道定序QQ
所以這篇文章分享給跟我一樣的人XD
簡單來說定序就是你下Order By
時的排序規則,還有下Where
條件時,預設幫你決定是否區分大小寫或區分全半形等。
這邊貼SSMS的說明給大家,如果覺得我寫得不夠清楚的,也可以直接看官方的說明哦!
SSMS 定序與 Unicode 支援
在SQL Server中預設定序是以作業系統的地區設定來做為基礎,如果你的系統語言是en-US
,預設的定序就是SQL_Latin1_General_CP1_CI_AS
,台灣的話則是Chinese_Taiwan_Stroke_CI_AS
。
想看更多地區預設的定序點我!
接下來說說定序後面的那些參數:
如果要用這些參數,前面記得要加底線,EX:
Latin1_General_CI_AI_KS
。
以上列幾個比較常用的給大家,想知道更多可以去看官方說明。
順帶一提,台灣的定序有兩種:Chinese_Taiwan_Bopomofo
及Chinese_Taiwan_Stroke
。
Chinese_Taiwan_Bopomofo
:用ㄅㄆㄇㄈ進行排序。Chinese_Taiwan_Stroke
:用筆畫進行排序。看到這邊應該已經知道前言的問題是出在哪了吧?
沒錯!就是我的定序給到CI啦~~~~
那要怎麼修正呢?辦法有兩種:
第一種方法也是最簡單的方法,直接改資料庫定序,永無後患~
設定路徑:對資料庫右鍵 -> 屬性 -> 選項 -> 定序
挑一個自己想要的定序就可以按確定囉!
如果今天只是有特定幾個條件需要改變定序,那COLLATE
就會是很好的方法!
直接提供程式碼給大家看:
SELECT * FROM USER WHERE NAME = 'Vivi' COLLATE Latin1_General_CS_AS;
輸出結果:
Id | Name |
---|---|
1 | Vivi |
SELECT * FROM USER Order By Name COLLATE Latin1_General_CS_AS;
輸出結果:
Id | Name |
---|---|
1 | vivi |
2 | Vivi |
注意:COLLATE
是要在每組條件個別加,不是在SQL最後寫一次就會讓所有的比對都區分大小寫。
SELECT * FROM USER
WHERE NAME = 'Vivi' COLLATE Latin1_General_CS_AS
Order By Name COLLATE Latin1_General_CS_AS;
那以上就是這次的分享啦!
資料來源都是SSMS的文件,文章內也有貼連結,有興趣可以直接看官方說明哦~